#title: Dao拦截器
#index:1
#author:wendal(wendal1985@gmail.com)
-----------------------------------------------------------------------------------------------------------------
为啥要实现Dao拦截器

	* DaoRunner和DaoExecutor的定制成本较高,拦截器让NutDao更容易定制.
	* 之前的设计没法很好的实现事务分离(DaoSupport和NutDaoRunner均有事务相关的代码)
	
-----------------------------------------------------------------------------------------------------------------
内置的拦截器实现

	* log -- 输出SQL语句到日志,这是NutDao默认情况下唯一启用的拦截器
	* time -- 打印sql执行耗时
	
如何自定义
-----------------------------------------------------------------------------------------------------------------

需要实现的接口

{{{<java>
public interface DaoInterceptor {
    void filter(DaoInterceptorChain chain) throws DaoException;
}
// DaoInterceptorChain 包含当前执行的全部信息,如Connection,DaoStatment等等
}}}

示例实现

{{{<java>
public class MyDaoInterceptor {
    public void filter(DaoInterceptorChain chain) throws DaoException {
        DaoStatement st = chain.getDaoStatement();
        if (st instanceof NutPojo) {
            // 如果是dao.insert(user)之类的操作,会进入这个分支
        } else if (st instanceof NutSql) {
        	// 如果是自定义SQL,会进入这个分支
        }
        chain.doChain();//继续下一个拦截器执行
    }
}
}}}

在ioc中的配置,以dao.js为例

{{{<js>
var ioc = {
		dao : {
			type : "org.nutz.dao.impl.NutDao",
			args : [{refer:"dataSource"}],
			fields : {
				interceptors : [
							"log", // 默认的日志还需要的
							"time", // 加个时间又如何呢?
							"net.demo.MyDaoInterceptor", // 加入自己的,才合适
							{refer:"superI"} // 引用另外一个bean作为拦截器
							]
			}
		}
}
}}}